// for...in 用于迭代对象的属性，包括继承的枚举属性。 此迭代语句可以与阵列字符串或普通对象一起使用，但不是使用映射或设置对象。
for (let prop in ['a', 'b', 'c'])
  console.log(prop);            // 0, 1, 2 (array indexes)
for (let prop in 'str')
  console.log(prop);            // 0, 1, 2 (string indexes)
for (let prop in {a: 1, b: 2, c: 3})
  console.log(prop);            // a, b, c (object property names)
for (let prop in new Set(['a', 'b', 'a', 'd']))
  console.log(prop);            // undefined (no enumerable properties)

// for...of 用于迭代可迭代对象，迭代它们的值而不是它们的属性。 此迭代语句可以与数组，字符串，映射或设置对象一起使用，但不是纯对象。
for (let val of ['a', 'b', 'c'])
  console.log(val);            // a, b, c (array values)
for (let val of 'str')
  console.log(val);            // s, t, r (string characters)
for (let val of {a: 1, b: 2, c: 3})
  console.log(prop);           // TypeError (not iterable)
for (let val of new Set(['a', 'b', 'a', 'd']))
  console.log(val);            // a, b, d (Set values)

// forEach 是数组原型的方法，它允许您遍历数组的元素，可以访问每个元素的值和索引时迭代。
['a', 'b', 'c'].forEach(
  val => console.log(val)     // a, b, c (array values)
);
['a', 'b', 'c'].forEach(
  (val, i) => console.log(i)  // 0, 1, 2 (array indexes)
);
